home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / 68hc11 / smallc11.arc / CC32.C < prev    next >
Text File  |  1988-05-27  |  3KB  |  138 lines

  1. heir14(lval)  int *lval; {
  2.   int k, const1, val, lval2[8];
  3.   char *ptr, *before, *start;
  4.   k=primary(lval);
  5.   ptr=lval[0];
  6.   blanks();
  7.   if((ch=='[')|(ch=='(')) {
  8.     lval[5]=1;      /* secondary register will be used */
  9.     while(1) {
  10.       if(match("[")) {                /* [subscript] */
  11.     if(ptr==0) {
  12.       error("can't subscript");
  13.       junk();
  14.       needtoken("]");
  15.       return 0;
  16.       }
  17.     else if(ptr[IDENT]==POINTER)rvalue(lval);
  18.     else if(ptr[IDENT]!=ARRAY) {
  19.       error("can't subscript");
  20.       k=0;
  21.       }
  22.     setstage(&before, &start);
  23.     lval2[3]=0;
  24.     plunge2(0, 0, heir1, lval2, lval2); /* lval2 deadend */
  25.     needtoken("]");
  26.     if(lval2[3]) {
  27.       clearstage(before, 0);
  28.       if(lval2[4]) {
  29.         if(ptr[TYPE]==CINT) const2(lval2[4]<<LBPW);
  30.         else        const2(lval2[4]);
  31.         add();
  32.         }
  33.       }
  34.     else {
  35.       if(ptr[TYPE]==CINT) doublereg();
  36.       add();
  37.       }
  38.     lval[0]=lval[2]=0;
  39.     lval[1]=ptr[TYPE];
  40.     k=1;
  41.     }
  42.       else if(match("(")) {           /* function(...) */
  43.     if(ptr==0) callfunction(0);
  44.     else if(ptr[IDENT]!=FUNCTION) {
  45.       rvalue(lval);
  46.       callfunction(0);
  47.       }
  48.     else callfunction(ptr);
  49.     k=lval[0]=lval[3]=0;
  50.     }
  51.       else return k;
  52.       }
  53.     }
  54.   if(ptr==0) return k;
  55.   if(ptr[IDENT]==FUNCTION) {
  56.     address(ptr);
  57.     return 0;
  58.     }
  59.   return k;
  60.   }
  61.  
  62. primary(lval)  int *lval; {
  63.   char *ptr;
  64.   int k;
  65.   if(match("(")) {                    /* (expression) */
  66.     k=heir1(lval);
  67.     needtoken(")");
  68.     return k;
  69.     }
  70.   putint(0, lval, 8<<LBPW); /* clear lval array */
  71.   if(symname(ssname, YES)) {
  72.     if(ptr=findloc(ssname)) {
  73. #ifdef STGOTO
  74.       if(ptr[IDENT]==LABEL) {
  75.     experr();
  76.     return 0;
  77.     }
  78. #endif
  79.       getloc(ptr);
  80.       lval[0]=ptr;
  81.       lval[1]=ptr[TYPE];
  82.       if(ptr[IDENT]==POINTER) {
  83.     lval[1]=CINT;
  84.     lval[2]=ptr[TYPE];
  85.     }
  86.       if(ptr[IDENT]==ARRAY) {
  87.     lval[2]=ptr[TYPE];
  88.     return 0;
  89.     }
  90.       else return 1;
  91.       }
  92.     if(ptr=findglb(ssname))
  93.       if(ptr[IDENT]!=FUNCTION) {
  94.     lval[0]=ptr;
  95.     lval[1]=0;
  96.     if(ptr[IDENT]!=ARRAY) {
  97.       if(ptr[IDENT]==POINTER) lval[2]=ptr[TYPE];
  98.       return 1;
  99.       }
  100.     address(ptr);
  101.     lval[1]=lval[2]=ptr[TYPE];
  102.     return 0;
  103.     }
  104.     ptr=addsym(ssname, FUNCTION, CINT, 0, &glbptr, STATIC);
  105.     lval[0]=ptr;
  106.     lval[1]=0;
  107.     return 0;
  108.     }
  109.   if(constant(lval)==0) experr();
  110.   return 0;
  111.   }
  112.  
  113. experr() {
  114.   error("invalid expression");
  115.   const1(0);
  116.   junk();
  117.   }
  118.  
  119. callfunction(ptr)  char *ptr; { /* symbol table entry or 0 */
  120.   int nargs, const1, val;
  121.   nargs=0;
  122.   blanks();          /* already saw open paren */
  123.   if(ptr==0) push();      /* calling HL */
  124.   while(streq(lptr,")")==0) {
  125.     if(endst()) break;
  126.     expression(&const1, &val);
  127.     if(ptr==0) swapstk(); /* don't push addr */
  128.     push();          /* push argument */
  129.     nargs=nargs+BPW;      /* count args*BPW */
  130.     if (match(",")==0) break;
  131.     }
  132.   needtoken(")");
  133.   if(ptr) call(ptr+NAME);
  134.   else callstk();
  135.   csp=modstk(csp+nargs, YES);
  136.   }
  137.  
  138.